﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Linq;

namespace WindowsService1
{
    public partial class MonitorEstadosVehiculos : ServiceBase
    {
        public System.Timers.Timer myTimer;

        public MonitorEstadosVehiculos()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            //Timer para el control del tiempo entre llamadas.
            myTimer = new System.Timers.Timer();
            //Intervalo de tiempo entre llamadas.
            myTimer.Interval = 20000;
            //Evento a ejecutar cuando se cumple el tiempo.
            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
            //Habilitar el Timer.
            myTimer.Enabled = true;
        }

        //En el evento myTimer_Elapsed se hace la llamada al Servicio Web. Pero, para evitar 
        //problemas de concurrencia se detiene el Timer antes de hacer la llamada y luego se 
        //vuelve a activar. Esto se muestra en el código myTimer_Elapsed. 

        private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {

            //Detiene el Timer
            myTimer.Enabled = false;
            //llama al Servicio Web
            CallServicioWeb();
            //habilita el Timer nuevamente.
            myTimer.Enabled = true;

        }


        private void CallServicioWeb()
        {

            //Proxy

            //SerivicioWeb.GeoIPService Proxy = new ServicioWindowsMonitor.SerivicioWeb.GeoIPService();

            ServiceReferenceRastrack.wsGetGPSDataReportsSoapClient obj = new ServiceReferenceRastrack.wsGetGPSDataReportsSoapClient();
            DateTime Tini;

            TimeSpan Tdif;

            try
            {

                //Tiempo de inicio de la llamada

                Tini = DateTime.Now;

                //llamada al servicio 
                //Proxy.GetGeoIP("200.10.12.126");
                Model.DataClassesAutosolDataContext contexto = new Model.DataClassesAutosolDataContext();
                var datos = from a in contexto.AUT_VEHICULOs
                            where a.ATV_ID == 2 && a.AVE_FECHA_COMPRA != null
                            select a;
                foreach (var v in datos)
                {

                    //identificar que cabezotes esta en transito y el estado permite enviar coordenadas

                    var datosPlacasEnTransito = from b in contexto.AUT_ORDEN_SALIDAs
                                                join c in contexto.AUT_VEHICULOs on b.AVE_ID_CABEZOTE equals c.AVE_ID

                                                where (c.AMA_PLACA == v.AMA_PLACA) && b.AOS_ESTADO == "S" && b.AES_ID == 1
                                                select new
                                                {
                                                    b.AOS_ID,
                                                    b.AVE_ID_TRAILER,
                                                    b.AOS_ESTADO,
                                                    b.AES_ID

                                                };
                                                foreach (var z in datosPlacasEnTransito)
                                                {
                                                    
                                                    //consultar los vines asociados a esa orden de cargue
                                                    string strVinesAsociados = "";
                                                    var datosVinesAsociadosOrden = from d in contexto.AUT_ORDEN_SALIDA_AUT_VINs
                                                                                   join e in contexto.AUT_VINEs on d.AVI_ID equals e.AVI_ID
                                                                                   where d.AOS_ID == z.AOS_ID
                                                                                   select new
                                                                                   {
                                                                                       e.AVI_VIN
                                                                                   };
                                                                                     foreach (var y in datosVinesAsociadosOrden)
                                                                                    {
                                                                                        if (strVinesAsociados != "")
                                                                                            strVinesAsociados = y.AVI_VIN;
                                                                                        else
                                                                                            strVinesAsociados = strVinesAsociados +"," + y.AVI_VIN;
                                                                                    }

                                                                                     ServiceReferenceRastrack.cDataLastReportVehicle objDataplaca = obj.wmGetGPSDataReport(v.AMA_PLACA);
                                                                                     float ftlLatitude = objDataplaca.p_fLatitude;
                                                                                     float ftlLongitud = objDataplaca.p_fLongitude;
                                                                                     string strPlaca = v.AMA_PLACA;

                                                                                     Model.REPORTEGM objREPORTEGM = new Model.REPORTEGM();

                                                                                     objREPORTEGM.DATOS = strPlaca + "," + ftlLatitude.ToString() + "," +
                                                                                         ftlLongitud.ToString() + "," + strVinesAsociados
                                                                                         + "," +
                                                                                     DateTime.Now.ToShortDateString();
                                                                                     contexto.REPORTEGMs.InsertOnSubmit(objREPORTEGM);
                                                                                     contexto.SubmitChanges();
 
                                                }

                    

                }



               // float dato = objDataSQA770.p_fLatitude;
                //Tiempo de respuesta

                Tdif = Tini.Subtract(DateTime.Now);

                //if (Tdif.Seconds < -10)
                //{

                //    Log("Servicio Lento: " + Tdif.Seconds.ToString() + "[S]");

                //}

            }

            catch (Exception X)
            {

                string str = X.Message.ToString();
                //Log(X.Message);

            }

        }

        protected override void OnStop()
        {
        }
    }
}
